import java.util.Arrays;
import java.util.Scanner;

/**
 * Created by L.jp
 * Description:
 * 小美不干外卖配送了，转行开了一家水果店。
 *  一天她接到了一个大单，客户订购了 n 个水果，并且要求打包成多个果篮，一个果篮最多装 m 个水果。
 * 为了包装方便，水果按从 1 到 n 编号，同一个果篮里装的水果编号必须是连续的。果篮的成本与容积成线性关系。为了估计容积，
 *  小美简单地用样本中点估计了一下。具体来说，假设一个果篮中装的最大的水果体积是 u，最小的是 v，
 * 那么这个果篮的成本就是 k × floor((u+v)/2) + s，其中 k 是果篮中装入水果的个数，s 是一个常数，floor(x) 是下取整函数，
 * 比如 floor(3.8)=3, floor(2)=2。
 * 用户并没有规定果篮的数量，但是希望果篮的成本越小越好，毕竟买水果就很贵了。请求出小美打包这 n 个水果所用的最小花费。
 *  输入描述
 *  第一行三个正整数 n, m, s。意义如题面所示。
 *  第二行 n 个正整数 a1, a2, ..., an，表示每个水果的体积。
 *  对于全部数据，1 ≤ n ≤ 104,   1 ≤ m ≤ 103,   m ≤ n,   1 ≤ ai, s ≤ 104。
 *  输出描述
 *  输出一个整数，表示打包这 n 个水果果篮的最小成本。
 * User: 86189
 * Date: 2023-04-11
 * Time: 0:02
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int s = scanner.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        
        for (int i = 1; i <= n; i++) {
            int max_a = a[i - 1];
            int min_a = a[i - 1];
            for (int j = i - 1; j >= Math.max(i - m - 1, 0); j--) {
                max_a = Math.max(max_a, a[j]);
                min_a = Math.min(min_a, a[j]);
                dp[i] = Math.min(dp[i], dp[j] + (i - j) * ((max_a + min_a) / 2) + s);
            }
        }
        
        System.out.println(dp[n]);
    }
}
